要做到 Streamlit 的功能,至少要考慮以下兩種機制:
讓我們看一個簡單的例子:使用者輸入名字後,立即顯示問候訊息。
import streamlit as st
name = st.text_input('Your name')
if name:
st.write(f'Hello, {name}!')
這段程式碼會在你的網頁上產生一個標籤為「Your name」的輸入框。當使用者輸入名字並離開輸入框時,網頁會自動更新,顯示「Hello, [name]!」的問候訊息。
每次使用者與應用程式互動(例如,輸入文字並且 unfocus、或點擊按鈕),Streamlit 就會從頭開始執行整個腳本,重新渲染整個頁面。
讓我們看另一個需要長時間執行的腳本:
import streamlit as st
import time
for i in range(5):
time.sleep(1)
st.text(str(i))
他的執行結果並不是等待五秒後一口氣在網頁上顯示 5 行 12345,而是隨著時間,12345 訊息一行一行逐條顯示。
要做到這樣,代表只在【執行完 script 才回傳 JSON response】是不夠的,使用者會感覺程式卡住,我們最後會需要 Websocket 的機制來讓 Server 在跑腳本時,主動傳送訊息讓 Client 知道需要變動畫面。
而 Streamlit 也確實使用 Websocket 做到這件事。